###################################################
# makefile for GNU Make V3.8
###################################################
WARNING= -Wall -Wno-main -Wno-unused-value -Wno-pointer-sign -Werror-implicit-function-declaration

###################################################
# MEMORY - currently support APP_DLL, MFG type ONLY!
###################################################
ifeq ($(APP_TYPE), MFG)
### MFG Type
    START_OF_FLASH=0xFD168000
    START_OF_SRAM=0xFD5C4000
    SIZE_OF_SRAM=128k
    SIZE_OF_HEAP=4000
    APP_MFG=1
else
### APP_DLL Type
    START_OF_FLASH=0x00100000
    ifeq ($(MODEL_NAME), T800)
    START_OF_SRAM=0x00300000
    else
    START_OF_SRAM=0x00200000
    endif
    SIZE_OF_SRAM=512k
    SIZE_OF_HEAP=100
    APP_MFG=0
endif

###################################################
# Source file directory
###################################################
OBJDIR=obj
SRCDIR=src
INCDIR=src
LSTDIR=lst
COMMON_SRCDIR=$(BUILD_DIR)/gcc

###################################################
# Source file list
###################################################
C_SRC=$(sort $(notdir $(wildcard $(SRCDIR)/*.c)))
A_SRC=$(sort $(notdir $(wildcard $(SRCDIR)/*.s)))
COMMON_C_SRC=$(sort $(notdir $(wildcard $(COMMON_SRCDIR)/*.c)))

###################################################
# Gen object file name automatically
###################################################
C_OBJ=$(addprefix $(OBJDIR)/, $(C_SRC:.c=.o))
A_OBJ=$(addprefix $(OBJDIR)/, $(A_SRC:.s=.o))
COMMON_C_OBJ=$(addprefix $(OBJDIR)/, $(COMMON_C_SRC:.c=.o))

OUT_FILE=$(PRJ_NAME)
BIN_FILE=$(PRJ_NAME).bin
TMS_FILE=$(PRJ_NAME).tms
MAP_FILE=$(PRJ_NAME).map
SCRIPT_FILE=$(PRJ_NAME).ld

###################################################
# Tools setup
###################################################
CROSS=arm-elf-
LIBCDIR=$(COMPILER_DIR)/arm-elf/lib/thumb/interwork -L $(COMPILER_DIR)/lib/gcc/arm-elf/4.1.1/thumb/interwork 
INCLUDES=-I $(INCDIR) -I $(BUILD_DIR) -I $(BUILD_DIR)/gcc -I $(COMPILER_DIR)/arm-elf/include
DEFINES=-D__NO_CTYPE -DSVN_REV=$(SVN_REC)

# PC0711 MCU name and submodel
MCU      = -mcpu=arm9
THUMB    = -mthumb
THUMB_IW = -mthumb-interwork
TEST_OPT = 

CC=$(CROSS)gcc
CFLAGS=-c -g $(THUMB) $(MCU) $(THUMB_IW) $(TEST_OPT) -Os $(WARNING) -fsigned-char $(INCLUDES) -D__pcs= -D$(MODEL_NAME)=1 -DAPP_MFG=$(APP_MFG)

ASM=$(CROSS)gcc
ASFLAGS=-D__ASSEMBLY__ -g $(THUMB) $(MCU) $(THUMB_IW) $(TEST_OPT) -c -Os -Wall $(INCLUDES) -D__pcs=

LINK=$(CROSS)gcc
LFLAGS=-nostartfiles -nodefaultlibs -nostdlib -Wl,-Map=$(MAP_FILE),--cref -L $(LIBCDIR) -L $(BUILD_DIR)/gcc -static -T $(SCRIPT_FILE)
LIBS=-lsyscall -lbasecall -lsptutil -lspglib -lc -lnosys -lm -lgcc

AR=$(CROSS)ar
ARFLAGS=-rc

OBJCOPY=$(CROSS)objcopy
#use hex for debug
#OCFLAGS=-S -O ihex
OCFLAGS=-S -O binary

#
BIN2TMS=$(TOOLS_DIR)/bin2tms
ifeq ($(MODEL_NAME), PR608D)
TMSFLAGS=-m$(MODEL_NAME)-HS -x XXXX XX XX XXXXXX XXXXXX
else
TMSFLAGS=-m$(MODEL_NAME) -x XXXX XX XX XXXXXX XXXXXX
endif

LOAD_APP=$(TOOLS_DIR)\Load.bat

############################################################################
# Extra objects
############################################################################
ifeq ($(WITH_EXTRA), 1)
include extra_gcc.mk
endif

############################################################################
# Linker script
############################################################################
APP_OFFSET=0x90
SIGNBIN=echo No Sign Applied .. 
## Normal sign (nor)
ifeq ($(SIGN), 1)
SIGNBIN=$(TOOLS_DIR)/NorSign.bat $(BIN_FILE)
endif
## Security Application sign (app)
ifeq ($(SIGN), 2)
SIGNBIN=$(TOOLS_DIR)/AppSign.bat $(BIN_FILE)
endif
## System sign (sys)
ifeq ($(SIGN), 3)
SIGNBIN=$(TOOLS_DIR)/SysSign.bat $(BIN_FILE)
endif

#Linker - currently removed little-end defined
LD_SCRIPT="OUTPUT_ARCH(arm) \
			ENTRY (cstartup) \
			SECTIONS {	\
				_start_of_data = $(START_OF_SRAM); \
				_start_of_flash = $(START_OF_FLASH); \
				_end_of_sram = _start_of_data + $(SIZE_OF_SRAM); \
				_start_of_header = _start_of_flash + 0x20; \
				_start_of_app = _start_of_flash + 0x50; \
				. = _start_of_flash; \
				.startup : { *(sect_startup) } \
				. = _start_of_header; \
				.header : { *(sect_header) } \
				. = _start_of_app + $(APP_OFFSET); \
				.text_kek : { *(sect_kek) } \
				.text : { *(.text .glue*) } \
				.const : { *(.rodata*) } \
				_end_of_app = (. + 3) & ~ 3; \
				. = _start_of_data; \
				.data : AT (_end_of_app) { *(.data) } \
				_end_of_data = (. + 3) & ~ 3; \
				. = _end_of_data; \
				_start_of_bss = .; \
				.bss : { *(.bss) } \
				end = (. + 3) & ~ 3; \
				_end_of_bss = (end + $(SIZE_OF_HEAP) + 3) & ~ 3; \
				_end_of_flash = _end_of_app + SIZEOF (.data); \
			}"

###################################################
# Link file
###################################################
.PHONY: build_all
build_all : $(A_OBJ) $(C_OBJ) $(COMMON_C_OBJ) $(EXTRA_OBJ)
	@echo .
	@echo [******** Link  $(OUT_FILE) ********]
	@echo_plus -n $(LD_SCRIPT) > $(SCRIPT_FILE)
	@$(LINK) $(LFLAGS) -o $(OUT_FILE) --start-group $(A_OBJ) $(C_OBJ) $(COMMON_C_OBJ) $(EXTRA_OBJ) $(LIBS) --end-group
	$(OBJCOPY) $(OCFLAGS) $(OUT_FILE) $(BIN_FILE)

###################################################
# Compile C files
###################################################
$(OBJDIR)/%.o : $(SRCDIR)/%.c
	@echo [$<]
	@$(CC) $(CFLAGS) $< -o $@ -Wa,-a=$(LSTDIR)/$(@F:.o=.lst)

###################################################
# Assembly ASM files
###################################################
$(OBJDIR)/%.o : $(SRCDIR)/%.s
	@echo [$<]
	@$(ASM) $(ASFLAGS) $< -o $@ -Wa,-a=$(LSTDIR)/$(@F:.o=.lst)
	
###################################################
# Compile Common C files
###################################################
$(OBJDIR)/%.o : $(COMMON_SRCDIR)/%.c
	@echo [$<]
	@$(CC) $(CFLAGS) $< -o $@ -Wa,-a=$(LSTDIR)/$(@F:.o=.lst)
	

###################################################
# initial variables
###################################################
.PHONY: init_var
init_var :
	@echo .
	@echo [********* Compile *********]
ifeq ($(wildcard $(OBJDIR)),)
	mkdir $(OBJDIR)
endif
ifeq ($(wildcard $(LSTDIR)),)
	mkdir $(LSTDIR)
endif
ifneq ($(wildcard $(SCRIPT_FILE)),)
	@del /F $(SCRIPT_FILE)
endif

###################################################
# finalize output
###################################################
.PHONY: finalize_output
finalize_output : $(BIN_FILE)
	@copy $(BIN_FILE) bin.bak
	@call $(SIGNBIN)
	@$(BIN2TMS) $(TMSFLAGS) $(BIN_FILE)
	@echo .
	@echo [****** Build Success ******]

###################################################
# Start here!!
###################################################
.PHONY: build
build :	init_var build_all finalize_output

###################################################
# Download Load Application
###################################################
.PHONY: load
load:
	@echo .
	@echo [****** Download  TMS ******]
	@$(LOAD_APP) $(TMS_FILE)

